home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-07-31 | 3.1 KB | 142 lines | [TEXT/Pyth] |
- # This script will generate the Resources interface for Python.
- # It uses the "bgen" package to generate C code.
- # It execs the file resgen.py which contain the function definitions
- # (resgen.py was generated by resscan.py, scanning the <Resources.h> header file).
-
- import addpack
- addpack.addpack(':Tools:bgen:bgen')
-
- from macsupport import *
-
-
- class ResMixIn:
-
- def checkit(self):
- OutLbrace()
- Output("OSErr _err = ResError();")
- Output("if (_err != noErr) return PyMac_Error(_err);")
- OutRbrace()
- FunctionGenerator.checkit(self) # XXX
-
- class ResFunction(ResMixIn, FunctionGenerator): pass
- class ResMethod(ResMixIn, MethodGenerator): pass
-
- # includestuff etc. are imported from macsupport
-
- includestuff = includestuff + """
- #include <Resources.h>
-
- #define resNotFound -192 /* Can't include <Errors.h> because of Python's "errors.h" */
- """
-
- finalstuff = finalstuff + """
-
- /* Alternative version of ResObj_New, which returns None for null argument */
- PyObject *OptResObj_New(itself)
- Handle itself;
- {
- if (itself == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- return ResObj_New(itself);
- }
-
- OptResObj_Convert(v, p_itself)
- PyObject *v;
- Handle *p_itself;
- {
- if ( v == Py_None ) {
- *p_itself = NULL;
- return 1;
- }
- if (!ResObj_Check(v))
- {
- PyErr_SetString(PyExc_TypeError, "Resource required");
- return 0;
- }
- *p_itself = ((ResourceObject *)v)->ob_itself;
- return 1;
- }
-
- """
-
- initstuff = initstuff + """
- """
-
- module = MacModule('Res', 'Res', includestuff, finalstuff, initstuff)
-
- getattrHookCode = """
- if (strcmp(name, "size") == 0)
- return PyInt_FromLong(GetHandleSize(self->ob_itself));
- if (strcmp(name, "data") == 0) {
- PyObject *res;
- char state;
- state = HGetState(self->ob_itself);
- HLock(self->ob_itself);
- res = PyString_FromStringAndSize(
- *self->ob_itself,
- GetHandleSize(self->ob_itself));
- HUnlock(self->ob_itself);
- HSetState(self->ob_itself, state);
- return res;
- }
- if (strcmp(name, "__members__") == 0)
- return Py_BuildValue("[ss]", "data", "size");
- """
-
- setattrCode = """
- static int
- ResObj_setattr(self, name, value)
- ResourceObject *self;
- char *name;
- PyObject *value;
- {
- char *data;
- long size;
-
- if (strcmp(name, "data") != 0 || value == NULL )
- return -1;
- if ( !PyString_Check(value) )
- return -1;
- size = PyString_Size(value);
- data = PyString_AsString(value);
- /* XXXX Do I need the GetState/SetState calls? */
- SetHandleSize(self->ob_itself, size);
- if ( MemError())
- return -1;
- HLock(self->ob_itself);
- memcpy((char *)*self->ob_itself, data, size);
- HUnlock(self->ob_itself);
- /* XXXX Should I do the Changed call immedeately? */
- return 0;
- }
- """
-
- class ResDefiniton(GlobalObjectDefinition):
-
- def outputCheckNewArg(self):
- Output("if (itself == NULL) return PyMac_Error(resNotFound);")
-
- def outputGetattrHook(self):
- Output(getattrHookCode)
-
- def outputSetattr(self):
- Output(setattrCode)
-
-
- resobject = ResDefiniton('Resource', 'ResObj', 'Handle')
- module.addobject(resobject)
-
- functions = []
- resmethods = []
-
- execfile('resgen.py')
- execfile('resedit.py')
-
- for f in functions: module.add(f)
- for f in resmethods: resobject.add(f)
-
- SetOutputFileName('Resmodule.c')
- module.generate()
-